/*
 * @Description:
 * @Author: your name
 * @version:
 * @Date: 2024-05-08 16:11:33
 * @LastEditors: your name
 * @LastEditTime: 2024-09-10 09:39:09
 */
import { defineStore } from "pinia";
import { displayByName } from "@/cesiumTools/LineMaterial/effectController";

export const useLineData = defineStore("lineData", {
    state: () => {
        return {
            lineData: [],
            // 全局共享viewer，注意标记为markRaw
            viewer: null,
            tileset: null,
            disable: false,
        };
    },
    getters: {
        Viewer() {
            return this.viewer;
        },
        Tile() {
            return this.tileset;
        },
        // 获取线路显示隐藏信息
        lineDisplay() {
            return this.lineData.map((item) => ({
                name: item.checked,
                id: item.id,
                name: item.name,
            }));
        },
        // 获取全部信息
        allData() {
            return this.lineData;
        },
    },

    actions: {
        setData(data){
            return new Promise((resolve,reject)=>{
                this.lineData=data.length?data:[]
                resolve(data)
            })
        },
        setViewer(viewer) {
            return new Promise((resolve, reject) => {
                this.viewer = viewer;
                resolve(viewer);
            });
        },
        setTileset(tileset) {
            return new Promise((resolve, reject) => {
                this.tileset = tileset;
                resolve(tileset);
            });
        },
        // 全局管理路线显隐
        displayLine(lineNames, isShow) {
            if (
                Array.isArray(lineNames) &&
                this.lineData.length &&
                !this.disable
            ) {
                const stationNames = [];
                // 控制state数据
                this.lineData.forEach((item) => {
                    const { stationsList, name } = item;
                    if (lineNames.includes(name)) {
                        item.checked = isShow;
                        stationsList.forEach((station) => {
                            stationNames.push(station.name);
                        });
                    }
                });
                // 控制地图元素
                displayByName(lineNames, stationNames, isShow);
            }
        },
        // 设置是否开启全局管理
        disableController(val) {
            this.disable = val;
        },
    },
});

export const useMeasureData = defineStore("measureData", {
    state: () => {
        return {
            measureData: [],
        };
    },
    getters: {
        // 获取全部信息
        allData() {
            return this.measureData;
        },
    },
    actions: {
        setData(data) {
            return new Promise((resolve, reject) => {
                this.measureData = data.length ? data : [];
                resolve(data);
            });
        },
        clearData() {
            return new Promise((resolve, reject) => {
                const data = this.measureData.map((item) => {
                    item.length && item.forEach((n) => (n.measures.length = 0));
                    return item;
                });
                this.measureData = data;
                resolve(data);
            });
        },
    },
});

// 由于lineData的state是异步的，所以需要监听action来获取数据
/* 这个函数的目的: 因为有的时候取pinia的数据时,数据还没有加载好,所以这里写一个函数,使用了$onAction,防止取不到数据 */
export const watchLineData = (actionName = "setData") => {
    return new Promise((resolve, reject) => {
        // $onAction 是 Pinia 提供的一个方法,接收一个回调作为参数,这个回调函数会在 store 的每个 action 执行时被调用
        /*  name：当前执行的 action 的名称。
        store：执行 action 的 store 实例。
        args：执行 action 时传入的参数。
        after：一个函数，在 action 成功执行后调用，可以获取 action 的返回值。
        onError：一个函数，在 action 执行出现错误时调用，可以获取错误对象。*/
        let store = useLineData();
        //这里数据请求只有一次，因此判断是否有数据就行
        if (actionName === "setData" && store.lineData.length) {
            resolve(store.lineData);
            return;
        }
        store.$onAction(({ name, store, args, after, onError }) => {
            if (name === actionName) {
                after((res) => {
                    console.log(res);
                    if (res) {
                        resolve(res);
                    }
                });
                onError((e) => {
                    reject(e);
                });
            }
        });
    });
};
